package com.hrm.system.controller;

import com.hrm.common.controller.BaseController;
import com.hrm.common.entity.PageResult;
import com.hrm.common.entity.Result;
import com.hrm.common.entity.ResultCode;
import com.hrm.common.exception.CommonException;
import com.hrm.common.utils.JwtUtils;
import com.hrm.domain.company.response.DeptListResult;
import com.hrm.domain.system.User;
import com.hrm.domain.system.response.ProfileResult;
import com.hrm.domain.system.response.UserResult;
import com.hrm.system.service.UserService;
import io.jsonwebtoken.Claims;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: 林海湾Sea
 * @Date :  2021/11/26 14:33
 * @Decription: 企业员工接口（控制器）
 */

@CrossOrigin // 解决跨域
@RestController
@RequestMapping("/sys")
public class UserController extends BaseController {

    @Autowired
    private UserService userService;

//    @Autowired
//    private JwtUtils jwtUtils;

    @Autowired
    private JwtUtils jwtUtils;

    /**
     * 1、保存员工
     */
    @RequestMapping(value = "/user", method = RequestMethod.POST)
    public Result save(@RequestBody User user) {
        /**
         * 企业id，目前使用固定值1，后面解决
         */
        user.setCompanyId(companyId);
        // 公司名
        user.setCompanyName(companyName);
        // 调用service完成员工保存
        userService.addUser(user);
        // 返回结果值
        return new Result(ResultCode.SUCCESS);
    }

    /**
     * 2、修改员工信息
     */
    @RequestMapping(value = "/user/{id}", method = RequestMethod.PUT)
    public Result update(@PathVariable(value = "id") String id, @RequestBody User user) {
        // 1、设置修改的部门id
        userService.update(user);
        return new Result(ResultCode.SUCCESS);
    }

    /**
     * 3、根据id删除员工
     */
    @RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE)
    public Result delete(@PathVariable(value = "id") String id) {
        userService.deleteUser(id);
        return new Result(ResultCode.SUCCESS);
    }

    /**
     * 4、根据id查找员工
     */
    @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
    public Result findById(@PathVariable(value = "id") String id) {
        User user = userService.findById(id);
        UserResult userResult = new UserResult(user);
        return new Result(ResultCode.SUCCESS, userResult);
    }

    /**
     * 5、查询企业员工列表
     *    分页展示
     *    请求参数：map集合
     */
    @RequestMapping(value = "/user", method = RequestMethod.GET)
    public Result findAll(int page, int size, @RequestParam Map map) {

        // 1、获取当前的企业id（将当前服务端获取到的companyId,放入到map集合中）
        map.put("companyId", companyId);
        // 2、完成查询
        Page<User> pageUser = userService.finaAll(map, page, size);
        // 3、构造返回结果值
        PageResult pageResult = new PageResult(pageUser.getTotalElements(), pageUser.getContent());
        return new Result(ResultCode.SUCCESS, pageResult);
    }

    /**
     * 分配角色
     * @param map
     * @return
     */
    @RequestMapping(value = "/user/assignRoles", method = RequestMethod.PUT)
    public Result assignRoles(@RequestBody Map<String, Object> map) {
        // 1、获取被分配的用户id
        String userId = (String) map.get("id");
        // 2、获取到角色的id列表
        List<String> roleIds = (List<String>) map.get("roleIds");
        // 3、调用service完成角色分配
        userService.assignRoles(userId, roleIds);
        return new Result(ResultCode.SUCCESS);
    }

    /**
     * 用户登录
     * @return
     *
     *
     */
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public Result login(@RequestBody Map<String, String> loginMap) {
        String mobile = loginMap.get("mobile");
        String password = loginMap.get("password");

        try {
            // 1、构造登录令牌 UsernamePasswordToken
            // 加密后的密码
            password = new Md5Hash(password, password, 3).toString();
            UsernamePasswordToken token = new UsernamePasswordToken(mobile, password);
            // 2、获取subject
            Subject subject = SecurityUtils.getSubject();
            // 3、调用login方法，进入realm完成认证
            subject.login(token);
            // 4、获取sessionId
            String sessionId = (String) subject.getSession().getId();
            // 5、构造返回结果
            return new Result(ResultCode.SUCCESS, sessionId);
        } catch (AuthenticationException e) {
            return new Result(ResultCode.MOBILEORPASSWORDERROR);
        }

//        User user = userService.findByMobile(mobile);
//        // 登录失败
//        if (null == user || !user.getPassword().equals(password)) {
//            return new Result(ResultCode.MOBILEORPASSWORDERROR);
//        } else {
//        // 登录成功
//            Map<String, Object> map = new HashMap<>();
//            map.put("companyId", user.getCompanyId());
//            map.put("companyName", user.getCompanyName());
//            // 用户ID，用户名，
//            String token = jwtUtils.createJwt(user.getId(), user.getUsername(), map);
//            return new Result(ResultCode.SUCCESS, token);
//        }
    }

    /**
     * 用户登录成功之后，获取用户信息
     *      1、获取用户id
     *      2、根据用户id查询用户
     *      3、构建返回值对象
     *      4、响应
     * @param request
     * @return
     */
    @RequestMapping(value = "/profile", method = RequestMethod.POST)
    public Result profile(HttpServletRequest request) throws Exception {
//        /**
//         * 从请求头信息中获取token数据
//         *  1、获取请求头信息，名称：Authorization
//         *  2、替换Bearer+空格
//         *  3、解析token
//         *  4、获取clamis
//         */
//
//        String authorization = request.getHeader("Authorization");
//        if (StringUtils.isEmpty(authorization)) {
//            throw new CommonException(ResultCode.UNAUTHENTICATED);
//        }
//        // 前后端约定头信息内容以：Bearer+空格+token 形式组成
//        String token = authorization.replace("Bearer ", "");
//        // 比较并获取claims
//        Claims claims = jwtUtils.parseJwt(token);
//        if (claims == null) {
//            throw new CommonException(ResultCode.UNAUTHENTICATED);
//        }
//        // 获取用户id
//        String userId = claims.getId();
//        User user = userService.findById(userId);
//        // 返回结果，包含用户信息
//        return new Result(ResultCode.SUCCESS, new ProfileResult(user));

//        claims.getId();

        // 1、获取session中的安全数据
        Subject subject = SecurityUtils.getSubject();
        // 2、subject获取所有的安全集合
        PrincipalCollection principals = subject.getPrincipals();
        // 3、获取安全数据
        ProfileResult result = (ProfileResult) principals.getPrimaryPrincipal();

        return new Result(ResultCode.SUCCESS, result);
    }
}
